#include "file.h"

file::file(QWidget* parent)
    : QMainWindow(parent)
    , ui(new Ui_file)
{
    ui->setupUi(this);

    connect(ui->action_new, &QAction::triggered, this, &file::Action_New_File);
    connect(ui->action_open, &QAction::triggered, this, &file::Action_Open_File);
    connect(ui->action_save, &QAction::triggered, this, &file::Action_Save_File);
    connect(ui->action_open_qs, &QAction::triggered, this, &file::Action_Open_Qs);
    connect(ui->action_save_qs, &QAction::triggered, this, &file::Action_Save_Qs);
}

file::~file()
{
    delete ui; 
}

void file::Action_New_File()
{
    ui->textEdit->clear();
    this->setWindowTitle("新建文本文档.txt");
}

void file::Action_Open_File()
{
    // QString fileName = QFileDialog::getOpenFileName(this, "打开文件", QCoreApplication::applicationDirPath(), "文本文件 (*.txt);;所有文件 (*.*)");
    QString fileName = QFileDialog::getOpenFileName(this, "打开文件", QDir::homePath(), "文本文件 (*.txt);;所有文件 (*.*)");
    if(!fileName.isEmpty())
    {
        QFile file(fileName);
        if(file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            QByteArray fileData = file.readAll();
            ui->textEdit->setPlainText(QString::fromUtf8(fileData));
            this->setWindowTitle(QFileInfo(fileName).fileName());
            file.close();
        }   
    }
    else
    {
        QMessageBox::warning(this, "警告", "未选择任何文件！");
    }
}


/**
 * @brief 保存文件功能
 * 该函数用于将文本编辑器中的内容保存到用户指定的文件中
 * 使用QFileDialog获取保存路径，并处理保存过程中的各种情况
 */
void file::Action_Save_File()
{
    // 弹出保存文件对话框，设置默认路径为用户主目录
    // 文件过滤器设置为文本文件和所有文件
    QString fileName = QFileDialog::getSaveFileName(this, "保存文件", QDir::homePath(), "文本文件 (*.txt);;所有文件 (*.*)");
    // 检查用户是否选择了文件名
    if(!fileName.isEmpty())
    {
        // 创建 QFile 对象
        QFile file(fileName);
        // 以只写和文本模式打开文件
        if(file.open(QIODevice::WriteOnly | QIODevice::Text))
        {
            // 创建 QTextStream 对象用于写入文本
            QTextStream out(&file);
            // 将文本编辑器中的内容写入文件
            out << ui->textEdit->toPlainText();
            // 关闭文件
            file.close();
        }
    }
    else
    {
        // 如果用户未选择文件，显示警告对话框
        QMessageBox::warning(this, "警告", "未选择任何文件！");
    }
}









/**
 * @brief 打开并读取文件内容的函数
 * 该函数提供了一个文件选择对话框，让用户选择要打开的文件
 * 然后读取文件内容并显示在文本编辑框中
 */
void file::Action_Open_Qs()
{
    QString fileName = QFileDialog::getOpenFileName(this, "打开文件", QDir::homePath(), "二进制文件 (*.dat);;所有文件 (*.*)");
    if(!fileName.isEmpty())
    {
        QFile file(fileName);
        if(file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            QDataStream in(&file);
            quint32 magic;
            quint32 version;
            in >> magic >> version;
            if(magic != 0xA0B0C0D0 || version != 1) {
                QMessageBox::warning(this, "警告", "文件格式不正确或版本不匹配！");
                return;
            }
            QString content;
            in >> content;
            ui->textEdit->setPlainText(content);
            this->setWindowTitle(QFileInfo(fileName).fileName());
            file.close();


        }
    }
}



/**
 * @brief 保存文本内容到二进制文件的功能函数
 * 该函数通过文件对话框获取用户指定的保存路径，然后将文本内容
 * 以二进制格式写入文件，包含文件头标识和版本号信息
 */
void file::Action_Save_Qs()
{
    // 弹出保存文件对话框，设置默认保存路径为用户主目录
    // 文件过滤器设置为二进制文件(.dat)和所有文件(*.*)
    QString file_name = QFileDialog::getSaveFileName(this, "保存文件", 
                                                    QDir::homePath(),  "二进制文件 (*.dat);;所有文件 (*.*)");
    // 检查用户是否选择了文件名
    if(!file_name.isEmpty()){
        
        // 创建 QFile 对象用于文件操作
        QFile file(file_name);
        if(file.open(QIODevice::WriteOnly)){
            QDataStream out(&file);
            out << (quint32)0xA0B0C0D0;  
            out << (quint32)1;         
            out << ui->textEdit->toPlainText();  
            file.close();

        }
    }
    else
    {
        QMessageBox::warning(this, "警告", "未选择任何文件！");
    }
}